package DAO;

import java.util.ArrayList;
import java.util.List;
import java.sql.*;
import javax.swing.JOptionPane;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.AreaBD;

public class AreaDAO {
       
    //Usado para o auto incremento e unique
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    // Conexão com o banco de dados
    ConexaoBD conBD = new ConexaoBD();
    
    Statement BDArea;
    ResultSet rs;
    
    public int autoIncremento(){
        return metBD.autoIncremento("area", "cod_area");
    }

    public List<AreaBD> listarAreas() {      
        List<AreaBD> listaFiltro = new ArrayList<AreaBD>(); 
        try { 
            Connection con = conBD.conectar();

            BDArea = con.createStatement();

            //busca todas as áreas cadastradas
            rs = BDArea.executeQuery("select * from area order by(cod_area)");

            if (rs != null) { 
                while (rs.next()) { 
                    AreaBD ar = new AreaBD();
                    //seta valores de código e nome
                    ar.setCodigo(rs.getInt("cod_area"));
                    ar.setNome(rs.getString("nome_area"));
                    listaFiltro.add(ar); 
                }
                return listaFiltro; 
            }else { 
                return null; 
            } 
        } catch (SQLException e) { 
            return null; 
        } 
    }

    public boolean inserirArea(AreaBD ar){
        try
        {
            Connection con = conBD.conectar();
            boolean vnome;

            //verifica nome duplicado => False: Está duplicado, True: Não duplicado
            vnome = metBD.unique("area", "nome_area", ar.getNome());

            if(vnome){
                BDArea = con.createStatement();
                BDArea.execute("INSERT INTO area VALUES ('"+ar.getCodigo()+"', "
                        + " '"+ar.getNome()+"' );");

                JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso",
                        "Cadastro", JOptionPane.INFORMATION_MESSAGE);

                con.close();
                return true;    
            }
            else //Nome duplicado
            {
                JOptionPane.showMessageDialog(null,"Área já existe", 
                        "Nome duplicado no banco de dados", 
                        JOptionPane.ERROR_MESSAGE);
                con.close();
                return false;
            }
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);     
        }       
        return false;
    }    

    public boolean excluirArea(int codigoEnviado){
        String sql = "delete from area where cod_area = ?";   

        try {
            Connection con = conBD.conectar();

            //Verifica se area que foi ENVIADO é usado para alguma disciplina
            BDArea = con.createStatement();
            rs = BDArea.executeQuery("SELECT count(cod_area) from disciplina "
                    + " where cod_area = '"+codigoEnviado+"' ");
            rs.last();
            int capturaDisciplina = rs.getInt(1);

            if(capturaDisciplina >= 1){ //Possui FK's?
                    JOptionPane.showMessageDialog(null,"Área esta ligada a disciplina,"
                            + " não pode ser excluída", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);   
                con.close();
                return false;              
            }
            else{
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, (String.valueOf(codigoEnviado)));
                if (ps.executeUpdate() > 0) {
                    con.close();
                    return true;
                } else {
                    con.close();
                    return false;
                }               
            }

        } catch (SQLException e) {
                JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
                "Erro no banco", JOptionPane.ERROR_MESSAGE);
                return false;
        }
    }

    public boolean alterarArea(AreaBD ar){
        String sql = "update area set nome_area = ?";
        sql += " where cod_area = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
            BDArea = con.createStatement();
            
            //Obtem o nome da area que foi ENVIADA para alteração
            rs = BDArea.executeQuery("SELECT nome_area from area "
                    + " where cod_area = '"+ar.getCodigo()+"'");
            rs.first();
            String capturaArea= rs.getString("nome_area");


            if(metBD.unique("area", "nome_area", ar.getNome()) || capturaArea.equals(ar.getNome())) // Deixa Cadastrar
            {
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, ar.getNome());
                ps.setString(2, (String.valueOf(ar.getCodigo())));
                if (ps.executeUpdate() > 0) {
                    JOptionPane.showMessageDialog(null,"Alteração realizada com sucesso.",
                            "Alterar", JOptionPane.INFORMATION_MESSAGE);
                    con.close();
                return true;
                } else {
                    JOptionPane.showMessageDialog(null,"Não foi possível realizar a alteração.",
                            "Erro em alterar", JOptionPane.ERROR_MESSAGE);
                    con.close();
                return false;
                }     
            }
            else{
                JOptionPane.showMessageDialog(null,"Já existe área com este nome.", 
                        "Área duplicada", JOptionPane.INFORMATION_MESSAGE);
                return false;
            }
      }catch (SQLException e) {
            JOptionPane.showMessageDialog(null,e.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
      }
    }
    
    public List<AreaBD> carregarComboArea(){
        List<AreaBD> listaarea = new ArrayList<AreaBD>(); //Lista para Codigo + nome
        try
        {      
            Connection con = conBD.conectar();         
            BDArea = con.createStatement();
            rs = BDArea.executeQuery("SELECT cod_area, nome_area "
                    + " from area ");
            
            AreaBD selecioneArea = new AreaBD();
            selecioneArea.setCodigo(-1);
            selecioneArea.setNome("-- Selecione uma área --");
            listaarea.add(selecioneArea);

            while(rs.next()){
                AreaBD ar = new AreaBD();
                ar.setCodigo(rs.getInt("cod_area"));
                ar.setNome(rs.getString("nome_area"));
                listaarea.add(ar);
            }  
            con.close();  
            return listaarea;
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
        }
        return listaarea;
    } 
}
